package cn.skylark.wcm.service.impl;

import cn.skylark.wcm.dao.ResourcesDao;
import cn.skylark.wcm.dao.RoleDao;
import cn.skylark.wcm.dao.UserDao;
import cn.skylark.wcm.entity.Resources;
import cn.skylark.wcm.entity.Role;
import cn.skylark.wcm.entity.User;
import cn.skylark.wcm.service.UserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户管理实装类
 *
 * @author 武文旭
 * @Date 20180109
 * @since
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    public UserDao userDao;
    @Autowired
    public RoleDao roleDao;
    @Autowired
    public ResourcesDao resourcesDao;
    Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);


    /**
     * 增加用户
     * 业务:调用插入语句增加用户信息
     *
     * @param user User
     * @return boolean
     */
    @Override
    public boolean addUser(User user) {
        logger.info("增加用户开始 用户=" + user);
        boolean bool = userDao.insert(user) > 0;
        logger.info("增加用户结束");
        return bool;
    }

    /**
     * 获取所有用户类别
     * 业务:通过租户id获取所有用户信息
     *
     * @param user
     * @param searchValue
     * @param start
     * @param length
     * @return
     */
    @Override
    public PageInfo<User> selectByPage(User user, String flag, String searchValue, int start, int length) {
        logger.info("分页获取用户信息--用户=" + user + " 启始页 = " + start + " 条数 = " + length);
        int page = start / length + 1;
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        //条件查询
        if (!StringUtils.isEmpty(searchValue)) {
            criteria.andLike("username", "%" + searchValue + "%");

        }
        if ("0".equals(flag)) {
            criteria.andEqualTo("tenanid", user.getTenanid());
            criteria.andEqualTo("delflg",0);
        }else {
            criteria.andEqualTo("delflg",0);
        }

        // 分页查询
        PageHelper.startPage(page, length);
        List<User> userList = userDao.selectByExample(example);
        logger.info("分页获取用户信息结束");
        return new PageInfo<>(userList);
    }

    /**
     * 根据用户名取用户信息
     * 业务：用户存在count>0
     *
     * @param user String
     * @return User
     */
    @Override
    public Integer selectByUsername(User user) {
        logger.info("根据用户名取用户信息 用户=" + user);
        Integer count = userDao.selectCount(user);
        logger.info("根据用户名取用户信息结束");
        return count;
    }

    /**
     * 删除用户
     * 业务:变更用户状态delflg为1
     *
     * @param userid Integer
     */
    @Override
    public void delUser(Integer userid) {
        logger.info("删除用户开始 用户id=" + userid);
        User user = new User();
        user.setId(userid);
        userDao.deleteUser(user);
        logger.info("删除用户");
    }

    /**
     * 将用户状态改为冻结
     * 业务：将用户状态由enable改回1
     *
     * @param userid
     */
    @Override
    public void updateStateFrozen(Integer userid) {
        logger.info("将用户状态改为冻结开始 用户id=" + userid);
        User user = new User();
        user.setId(userid);
        userDao.updateStateFrozen(user);
        logger.info("将用户状态改为冻结结束");
    }

    /**
     * 更改用户状态改为恢复
     * 业务:将用户状态由enable改回0
     *
     * @param userid
     */
    @Override
    public void updateStateRecovery(Integer userid) {
        logger.info("更改用户状态改为恢复 用户id=" + userid);
        User user = new User();
        user.setId(userid);
        userDao.updateStateRecovery(user);
        logger.info("更改用户状态改为恢复结束");
    }

    /**
     * 通过用户的id查询用户的个人资料
     * 业务：通过用户对象获取用户信息
     *
     * @param user
     * @return
     */
    @Override
    public User getUserDataById(User user) {
        logger.info("根据用户id获取用户信息 用户=" + user);
        User userdata = userDao.selectOne(user);
        logger.info("根据用户id获取用户信息");
        return userdata;
    }

    /**
     * 通过上传的用户信息，对用户信息进行新增
     * 业务:进行用户新增
     *
     * @param user
     */
    @Override
    public void saveUserDataById(User user) {
        logger.info("通过上传的用户信息，对用户信息进行新增开始 用户=" + user);
        userDao.saveUserDataById(user);
        logger.info("通过上传的用户信息，对用户信息进行新增结束");
    }

    /**
     * 修改用户密码
     * 业务:将用户密码进行替换
     *
     * @param user
     */
    @Override
    public void updatePassword(User user) {
        logger.info("修改用户密码开始 用户=" + user);
        userDao.updatePassword(user);
        logger.info("修改用户密码结束");
    }

    /**
     * 登录系统用
     * 1：获得用户信息（用户实体类）
     * 2：未取得用户信息时，返回空MAP
     * 3：取得用户信息时，取用户ID，调用获取角色信息queryRoleListByUserId
     * 4：取得角色信息为空时，返回值中该用户角色信息为NULL
     * 5：取得角色信息不为空时，返回值中设定该用户角色信息
     * 6：取得角色不为空时，调用获取权限信息queryAllResourceWithUserid
     *
     * @param user 用户实体
     * @return 获得该用户信息, 角色信息及权限首地址
     */
    @Override
    public Map<String, Object> login(User user) {
        Map<String, Object> ret = new HashMap<>();
        /**
         * 获得用户信息
         */
        user.setEnable( 0 );
        user.setDelflg( 0 );
        User retUser = userDao.selectOne(user);
        if (retUser != null) {
            ret.put("user", retUser);
            /**
             * 获取角色名称
             */
            List<Role> roles = roleDao.queryRoleListByUserId(retUser.getId());
            if (roles.isEmpty()) {
                ret.put("role", null);
            } else {
                ret.put("role", roles);
            }
            /**
             * 获取权限
             */
            List<Resources> resources = resourcesDao.getResourceWithUserid(retUser.getId());
            if (resources.isEmpty()) {
                ret.put("resource", null);
            } else {
                ret.put("resource", resources);
            }
        }
        return ret;
    }

    /**
     * 通过用户id查询用户
     *
     * @param user
     * @return
     */
    @Override
    public User selectUserById(User user) {
        logger.info("通过用户id查询用户开始 用户" + user);
        User userDate = userDao.selectOne(user);
        logger.info("通过用户id查询用户结束");
        return userDate;
    }

}
